//
//  MSDataBaseModel.h
//  MSDemo
//
//  Created by ms on 2024/1/30.
//

#import <Foundation/Foundation.h>
NS_ASSUME_NONNULL_BEGIN

/**  */
@interface MSDataBaseModel : NSObject

/** 主键 id，1、2、3... */
@property (nonatomic, assign)           NSInteger       pk;
/** 列名，初始化时自动赋值 */
@property (retain, readonly, nonatomic) NSMutableArray  *columeNames;
/** 列类型，初始化时自动赋值 */
@property (retain, readonly, nonatomic) NSMutableArray  *columeTypes;

/**
 *  获取该类的所有属性
 */
+ (NSDictionary *)ms_getPropertys;
/** 获取所有属性，包括主键 */
+ (NSDictionary *)ms_getAllProperties;
/** 数据库中是否存在表 */
+ (BOOL)ms_isExistInTable;
/** 表中的字段*/
+ (NSArray *)ms_getColumns;


#pragma mark - insert
/** 保存单个数据 */
- (BOOL)save;
/** 批量保存数据 */
+ (BOOL)ms_saveObjects:(NSArray *)array;


#pragma mark - update
/** 更新单个数据 */
- (BOOL)ms_update;
/** 批量更新数据*/
+ (BOOL)ms_updateObjects:(NSArray *)array;


#pragma mark - insert/update
/** 保存或更新
 * 如果不存在主键，保存，
 * 有主键，则更新
 */
- (BOOL)ms_saveOrUpdate;
/** 保存或更新
 * 如果根据特定的列数据可以获取记录，则更新，
 * 没有记录，则保存
 */
- (BOOL)ms_saveOrUpdateByColumnName:(NSString*)columnName AndColumnValue:(NSString*)columnValue;


#pragma mark - delete
/** 删除单个数据 */
- (BOOL)ms_deleteObject;
/** 批量删除数据 */
+ (BOOL)ms_deleteObjects:(NSArray *)array;
/** 通过条件删除数据 */
+ (BOOL)ms_deleteObjectsByCriteria:(NSString *)criteria;
/** 通过条件删除 (多参数）--2 */
+ (BOOL)ms_deleteObjectsWithFormat:(NSString *)format, ...;
/** 清空表 */
+ (BOOL)ms_clearTable;
#pragma mark - query
/** 查询全部数据 */
+ (NSArray<MSDataBaseModel *> *)ms_findAll;
/** 通过条件查找数据
 * 这样可以进行分页查询，例如：@" WHERE pk > 5 limit 10"
 */
+ (NSArray *)ms_findByCriteria:(NSString *)criteria;
/** 通过条件查找数据 */
+ (NSArray *)ms_findWithFormat:(NSString *)format, ...;
/** 通过条件查找第一个数据，例如：@" WHERE pk > 5 limit 10" */
+ (instancetype)ms_findFirstByCriteria:(NSString *)criteria;
/** 通过主键查询 */
+ (instancetype)ms_findAll:(int)inPk;
/** 通过条件查找第一个数据 */
+ (instancetype)ms_findFirstWithFormat:(NSString *)format, ...;


#pragma mark - create table
/**
 * 创建表/更新队列
 * 成功返回YES
 */
+ (BOOL)ms_createTable;


#pragma mark - must be override method
/** 如果子类中有一些property不需要创建数据库字段，那么这个方法必须在子类中重写
 */
+ (NSArray *)ms_transients;

@end

/** 辅助类 */
@interface MSDataBaseModelHelp : NSObject

/** 数据存储队列*/
@property (nonatomic, retain, readonly) FMDatabaseQueue *dbQueue;

+ (MSDataBaseModelHelp *)shareInstance;
/** 更改db文件夹名称
 * directoryName 文件夹名称
 */
- (BOOL)ms_changeDBWithDirectoryName:(NSString *)directoryName;

@end

NS_ASSUME_NONNULL_END
